#include <vector>
#include <sstream>
#include <iostream>
#include <string>
#include <jsoncpp/json/json.h>
// 使用jsoncpp库进行多个数据对象的序列化
std::string serialize()
{
    std::cout << "serialize->" << std::endl;
    // 1.将需要进行序列化的多个不同种类的数据，集合存储到value对象中
    Json::Value root;
    root["姓名"] = "张三";   // grep -R 'Value(' /usr/include/jsoncpp/json/value.h递归搜索
    root["年龄"] = 18;       // 单参数构造+拷贝构造
    root["成绩"].append(98); // root["成绩"]先构造一个Json::Value对象出来，然后使用append函数来添加数组元素
    root["成绩"].append(88.5);
    root["成绩"].append(78.5);
    // 2.实例化StreamWriterBuilder工厂类对象，使用该对象生产一个StreamWriter对象
    Json::StreamWriterBuilder swb;
    Json::StreamWriter *sw = swb.newStreamWriter();
    // 3.使用StreamWriter对象进行Json::Value中存储的不同种类的多个数据进行序列化
    std::stringstream ss;
    int ret = sw->write(root, &ss);
    if (ret != 0)
    {
        std::cout << "Json::serialize failed!!\n";
        return "";
    }
    std::cout << ss.str() << std::endl;

    delete sw; // 别忘记new出来的内存要释放，否则内存泄露
    return ss.str();
}
void deserialize(const std::string str)
{
    std::cout << "deserialize->" << std::endl;
    // 1.实例化一个CharReaderBuilder工厂类对象，使用该对象生产一个CharReader对象
    Json::CharReaderBuilder crb;
    Json::CharReader *cr = crb.newCharReader();
    // 2.定义一个Json::Value对象，用于存储CharReader对象反序列化str之后的数据
    Json::Value root;
    std::string err;
    // bool parse(char* start, char* end, Json::Value* val, string* err);
    bool ret = cr->parse(str.c_str(), str.c_str() + str.size(), &root, &err);
    if (ret == false)
    {
        std::cout << "json deserialize failed!!" << err << std::endl;
        return;
    }
    // 3.逐个对象去访问Json::Value中的数据
    std::cout << "姓名: " << root["姓名"].asCString() << std::endl;
    std::cout << "年龄: " << root["年龄"].asInt() << std::endl;
    int sz = root["成绩"].size();
    for (int i = 0; i < sz; i++)
        std::cout << "成绩: " << root["成绩"][i].asFloat() << std::endl;
    delete cr;
}
int main()
{
    deserialize(serialize());
    return 0;
}